﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace DEMSoft
{
    namespace Khuong
    {
        class Ex1
        {
            static void Main(string[] args)
            {
                //Nhap tap hop cac diem ban dau
                double[,] points = { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 1, 0 } };
                // Diem dang can xet xem gan diem nao nhat
                double[] point = { 0.9, 0.9 };
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();
                //Lay chi so cua nut gan nhat
                int index = GetNearestPoint(points, point);
                stopwatch.Stop();
                Console.WriteLine("Nut gan nhat la nut thu {0} co toa do ({1},{2})", index, points[index, 0], points[index, 1]);
                Console.WriteLine("Thoi gian thuc thi code la: {0}", stopwatch.Elapsed);
            }

            /// <summary>
            /// Phuong thuc tim diem gan nhat voi diem cho truoc
            /// </summary>
            /// <param name="points">
            /// Tập các điểm cho trước
            /// Mảng 2 chiều double[,], có n nút thì sẽ có n hàng, cột 1 là tọa độ X, cột 2 là tọa độ Y
            /// </param>
            /// <param name="point">
            /// Điểm cần tìm nút gần nhất
            /// Mảng 1 chiều double[], cột 1 là tọa độ X, cột 2 là tọa độ Y
            /// </param>
            /// <returns>
            /// Trả về chỉ số nút gần nhất với nút cho trước
            /// </returns>
            public static int GetNearestPoint(double[,] points, double[] point)
            {
                int index = -1;//dua vao chi so index la -1 tuc nghia la chua co nut gan nhat
                double rMin = 999999;//dua vao so ban dau rat lon
                //Xet tung nut trong tap hop nut da cho. Tai nut hien tai, tinh khoang cach 
                //tu nut dang xet den nut can kiem tra.
                //Neu thay khoang cach nay nho hon khoang cach nho nhat thi luu lai chi so 
                //cua nut hien tai va luu khoang cach hien tai vao khoang cach nho nhat.
                for (int i = 0; i < points.GetLength(0); i++)
                {
                    double[] currentPoint = { points[i, 0], points[i, 1] };
                    double r = distance(point, currentPoint);
                    if (r < rMin)//da tim thay nut co khoang cach nho hon nut hien tai
                    {
                        index = i;
                        rMin = r;
                    }
                }
                return index;
            }

            /// <summary>
            /// Phương thức tính khoảng cách giữa 2 điểm
            /// </summary>
            /// <param name="p1">
            /// Tọa độ điểm thứ nhất
            /// </param>
            /// <param name="p2">
            /// Tọa độ điểm thứ hai
            /// </param>
            /// <returns>
            /// khoảng cách giữa hai điểm
            /// </returns>
            public static double distance(double[] p1, double[] p2)
            {
                return Math.Sqrt(Math.Pow(p1[0] - p2[0], 2) + Math.Pow(p1[1] - p2[1], 2));
            }

        }
    }
}
